#include <iostream>
#include "list"

using namespace std;

/*
 * list容器   是一种物理储存单元上非连续的储存结构，元素的逻辑顺序是通过链表中的指针链接实现的
 *      链表是由节点组成的，节点包括数据域与指针域
 *
 * STL中的链表是一个双向循环链表
 *
 * list中的迭代器只支持前移和后移，属于双向迭代器  插入和删除都不会造成原有迭代器的失效，在vector中是不成立的
 * 构造函数
 *      list<T> lst      默认构造函数
 *      list<T>(lst.begin(), lst.end())     将[lst.begin(), lst.end())之间的元素拷贝给本身
 *      list<T>(n, elem)   将n个elem拷贝给本身
 *      list<T>(const list & lst)  拷贝构造函数
 * 赋值与交换
 *      assign(lst.begin(), lst.end())  将[lst.begin(), lst.end())之间的元素拷贝赋值给本身
 *      assign(n, elem)     将n个elem拷贝赋值给本身
 *      list& operator=(const list &lst)  重载等号
 *      swap(lst)   将lst与本身的元素互换
 * 大小
 *      size()  返回容器中元素的个数
 *      empty() 判断容器是否为空
 *      resize(num)    重新指定容器的长度为num，若变长，则用默认值填充新位置，若变短，则删除末尾超过长度的元素
 *      resize(num, elem)    重新指定容器的长度为num，若变长，则用elem 填充新位置，若变短，则删除末尾超过长度的元素
 * 插入和删除    pos为迭代器
 *      push_back(elem)     尾部插入elem
 *      pop_back()  删除尾部元素
 *      push_front(elem)    头部插入elem
 *      pop_front()     删除头部元素
 *      insert(pos, elem)   在pos位置插elem元素的拷贝，返回新数据的位置
 *      insert(pos, n, elem)   在pos位置插n个elem元素，无返回值
 *      insert(pos, lst.begin(), lst.end())     在pos位置插[lst.begin(), lst.end())区间的数据，无返回值
 *      clear()     清空容器中数据
 *      erase(lst.begin(), lst.end())   删除[lst.begin(), lst.end())区间的数据，返回下一个数据的位置
 *      erase(pos)  删除pos位置的数据，返回下一个数据的位置
 *      remove(elem)    删除容器中所有与elem值匹配的元素
 * 数据存取
 *      front()     返回第一个元素
 *      back()      返回最后一个元素
 * 反转和排序
 *      reverse()   反转链表
 *      sort()      链表排序  与deque和vector不同，list不支持随机访问迭代器，所以不可以用标准算法sort(beg, end),
 *                  应使用list内置的sort()算法
 */

bool myCompare(int v1, int v2){
    return v1 > v2;
}

void myPrint(list<int> lst){
    for (list<int>::iterator it= lst.begin(); it != lst.end() ; ++it) {
        cout << *it << " ";
    }
    cout << endl;
}

void test01(){
    list<int> lst;
    lst.push_back(2);
    lst.push_back(1);
    lst.push_back(0);
    lst.push_back(4);
    lst.push_back(5);

    lst.sort();
    myPrint(lst);

    lst.sort(myCompare);
    myPrint(lst);
}

int main() {

    test01();

    return 0;
}
